package hyy_2022;


/**
 * 顺时针打印矩阵
 */
public class _0813_Offer29_SpiralOrder {

    /**
     * 1、空值处理,当matrix为null时,直接返回空列表
     * 2、初始化,矩阵左、右、上、下四个边界l,r,t,b, 用于打印的结果列表res
     * 3、循环打印,"从左到右,从上到下,从右到左,从下到上"四个方向循环,每个方向打印中做以下三件事
     *      根据边界打印,即将元素按顺序添加至列表res尾部
     *      边界向内收缩1(代表已被打印)
     *      判断是否被打印完毕(边界是否相遇),若打印完毕则跳出
     *
     * @param matrix
     * @return int[]
     */
    public int[] spiralOrder(int[][] matrix) {
        if(matrix.length == 0) {
            return null;
        }
        int l = 0; //左边界
        int r = matrix[0].length - 1; //右边界
        int t = 0;//上边界
        int b = matrix.length - 1;//下边界
        int[] res = new int[(r+1) * (b+1)]; //初始化res

        int x = 0; // res
        while(true) {
            //left to right
            for(int i = 1; i<=r; i++) {
                res[x++] = matrix[t][i];
            }
            if(++t > b) {
                break;
            }
            //top to bottom
            for(int i = t; i <= b; i++) {
                res[x++] = matrix[i][r];
            }
            if(l > --r) {
                break;
            }
            //right to left
            for(int i = r; i >= l ; i--) {
                res[x++] = matrix[b][i];
            }
            if(t > --b) {
                break;
            }
            //bottom to top
            for(int i = b;i >= t; i--) {
                res[x++] = matrix[i][l];
            }
            if(++l > r) {
                break;
            }

        }
        return  res;
    }
}
